package main

import (
	"bufio"
	"flag"
	"fmt"
	"io/ioutil"
	"log"
	"os"

	"github.com/gobuffalo/packr"
)

func test(fptr *string) {
	fmt.Println("读取文件")
	// 将文件读取至内存
	data, err := ioutil.ReadFile(*fptr)
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println(string(data))
	}
}

func test1() {
	fmt.Println("将文件绑定到二进制文件中")
	box := packr.NewBox("../day10")
	data := box.String("./test.txt")
	fmt.Println("Contents of file:", data)
}

func test2() {
	fmt.Println("分块读取文件")
	// 打开文件
	f, err := os.Open("test.txt")
	if err != nil {
		log.Fatal(err)
	}
	// 延迟文件关闭
	defer func() {
		// 关闭文件（并且打印错误）
		if err = f.Close(); err != nil {
			log.Fatal(err)
		}
	}()
	// 创建缓冲读取器
	r := bufio.NewReader(f)
	// 创建3字节长度的字节切片
	b := make([]byte, 10)
	for {
		_, err := r.Read(b)
		if err != nil {
			fmt.Println("Error reading file:", err)
			break
		}
		fmt.Println(string(b))
	}
}

func test3() {
	fmt.Println("逐行读取文件")
	f, err := os.Open("./test.txt")
	if err != nil {
		log.Fatal(err)
	}
	defer func() {
		if err = f.Close(); err != nil {
			log.Fatal(err)
		}
	}()
	s := bufio.NewScanner(f)
	for s.Scan() {
		fmt.Println(s.Text())
	}

	// 返回扫描过程中出现的错误
	err = s.Err()
	if err != nil {
		log.Fatal(err)
	}
}

func test4() {
	fmt.Println("将字符串写入文件")
	// 创建文件
	f, err := os.Create("./test1.txt")
	if err != nil {
		log.Fatal(err)
		return
	}

	// 写入内容
	l, err := f.WriteString("Hello World")
	if err != nil {
		fmt.Println(err)
		f.Close()
		return
	}
	fmt.Println(l, "bytes written successfully")
	err = f.Close()
}

func test5() {
	fmt.Println("将字节写入文件")
	d2 := []byte{104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100}
	// 创建文件
	f, err := os.Create("./test2.txt")
	if err != nil {
		log.Fatal(err)
		return
	}

	// 写入内容
	l, err := f.Write(d2)
	if err != nil {
		fmt.Println(err)
		f.Close()
		return
	}
	fmt.Println(l, "bytes written successfully")
	err = f.Close()
}

func test6() {
	fmt.Println("追加至文件")
	f, err := os.OpenFile("./test2.txt", os.O_APPEND|os.O_WRONLY, 0644)
	if err != nil {
		fmt.Println(err)
		return
	}
	newLine := "File handling is easy."
	_, err = fmt.Fprint(f, newLine)
	if err != nil {
		fmt.Println(err)
		f.Close()
		return
	}
	err = f.Close()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("file appended successfully")
}

func test7() {
	fmt.Println("并发写入	")
}

func main() {
	// 命令行参数
	fptr := flag.String("fpath", "./test.txt", "file path to read from")
	flag.Parse()
	fmt.Println(*fptr)

	// test(fptr)
	// test1()
	// test2()
	// test3()
	// test4()
	// test5()
	// test6()
	test7()
}
